package exercise.基础练习;

import java.util.Scanner;

/**
 * 资源限制
 * 时间限制：1.0s   内存限制：512.0MB
 * 问题描述
 * 　　给定n个十六进制正整数，输出它们对应的八进制数。
 * <p>
 * 输入格式
 * 　　输入的第一行为一个正整数n （1<=n<=10）。
 * 　　接下来n行，每行一个由0~9、大写字母A~F组成的字符串，表示要转换的十六进制正整数，每个十六进制数长度不超过100000。
 * <p>
 * 输出格式
 * 　　输出n行，每行为输入对应的八进制正整数。
 * <p>
 * 　　【注意】
 * 　　输入的十六进制数不会有前导0，比如012A。
 * 　　输出的八进制数也不能有前导0。
 * <p>
 * 样例输入
 * 　　2
 * 　　39
 * 　　123ABC
 * <p>
 * 样例输出
 * 　　71
 * 　　4435274
 * <p>
 * 　　【提示】
 * 　　先将十六进制数转换成某进制数，再由某进制数转换成八进制。
 */
public class B12_十六进制转八进制 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int total = sc.nextInt();
        for (int i = 0; i < total; i++) {
            String number_hex = sc.next();//读取下一行
            String bin_str = hexToBin(number_hex);//16进制转2进制字符串
            print_binToOct(bin_str);
        }
    }

    /**
     * 十六转二进制
     * @param hex_str
     * @return
     */
    private static String hexToBin(String hex_str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0, length = hex_str.length(); i < length; i++) {
            switch (hex_str.charAt(i)) {
                case '0': sb.append("0000");break;
                case '1': sb.append("0001");break;
                case '2': sb.append("0010");break;
                case '3': sb.append("0011");break;
                case '4': sb.append("0100");break;
                case '5': sb.append("0101");break;
                case '6': sb.append("0110");break;
                case '7': sb.append("0111");break;
                case '8': sb.append("1000");break;
                case '9': sb.append("1001");break;
                case 'A': sb.append("1010");break;
                case 'B': sb.append("1011");break;
                case 'C': sb.append("1100");break;
                case 'D': sb.append("1101");break;
                case 'E': sb.append("1110");break;
                case 'F': sb.append("1111");break;
            }
        }
        //去除左侧的0后返回
        return deleteLeftZero(sb.toString());
    }

    /**
     * 删除二进制字符串中左侧的0
     * @return
     */
    private static String deleteLeftZero(String bin_str){
        for (int i = 0,length = bin_str.length(); i < length; i++) {
            if (bin_str.charAt(i) != '0'){
                return bin_str.substring(i);//截取第i个下标到字符串末尾
            }
        }
        return "0";//上述循环如果没有return说明全是0
    }

    /**
     * 输出二转八进制
     * @param bin_str
     * @return
     */
    private static void print_binToOct(String bin_str) {
        StringBuilder result = new StringBuilder();
        int mod = bin_str.length() % 3;
        //左侧添零
        if (mod == 1) {
            bin_str = "00" + bin_str;
        } else if (mod == 2) {
            bin_str = "0" + bin_str;
        }
        //输出
        for (int left = 0, right = 2, length = bin_str.length(); right < length; left += 3, right += 3) {
            switch (bin_str.substring(left,right + 1)) {
                case "000": result.append("0");break;
                case "001": result.append("1");break;
                case "010": result.append("2");break;
                case "011": result.append("3");break;
                case "100": result.append("4");break;
                case "101": result.append("5");break;
                case "110": result.append("6");break;
                case "111": result.append("7");break;
            }
        }
        System.out.println(result.toString());
    }
}
